1 module geany_dlang.config; 2 3 import logger; 4 import std.file; 5 import std.conv; 6 import dyaml; 7 import yamlserialized; 8 9 @safe: 10 11 struct Config 12 { 13 bool useCharAddEvent; 14 string[] additionalPaths; 15 } 16 17 import geany_d_binding.geany.plugindata: GeanyData; 18 19 class ConfigFile 20 { 21 private string filepath; 22 Config config; 23 24 this(in GeanyData* geany_data) 25 { 26 import std.path; 27 28 string confDir; 29 30 () @trusted { confDir = geany_data.app.configdir.to!string; }(); 31 32 const dir = buildPath(confDir, "plugins", "dlang_plugin"); 33 dir.mkdirRecurse; 34 35 filepath = buildPath(dir, "dlang_plugin.conf"); 36 37 nothrowLog!"info"("Config file is "~filepath); 38 39 if(!filepath.exists) 40 { 41 config = Config(); // default config will be used 42 43 import geany_dlang.dcd_wrapper: DcdWrapper; 44 config.additionalPaths = DcdWrapper.loadConfiguredImportDirs; 45 } 46 else 47 { 48 config = filepath.loadConf; 49 } 50 } 51 52 ~this() 53 { 54 saveConf(); 55 } 56 57 void saveConf() 58 { 59 import std.stdio: File; 60 61 auto root = config.toYAMLNode; 62 63 if(!filepath.exists) 64 filepath.append(""); // creates dirs tree and empty config file 65 66 auto dumper = dumper(); 67 auto file = File(filepath, "w"); 68 dumper.dump(file.lockingTextWriter, root); 69 file.flush; 70 } 71 } 72 73 private Config loadConf(string filename) 74 { 75 ubyte[] buf; 76 77 () @trusted { buf = cast(ubyte[]) readText(filename); }(); 78 79 Config ret; 80 81 Loader.fromBuffer(buf).load().deserializeInto(ret); 82 83 return ret; 84 }